package com.jingding.procurement.restful;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 通用响应对象
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonResult<T> implements Serializable {

    /**
     * 状态码
     */
    private Integer code;
    /**
     * 消息
     */
    private String message;
    /**
     * 数据
     */
    private List<T> data;
    /**
     * 数据条数
     */
    private Integer total=0;

    /**
     * 创建响应结果对象，表示"成功"，不封装其它任何数据
     *
     * @return 响应结果对象
     */
    public static JsonResult<Void> ok() {
        return ok(null);
    }

    /**
     * 创建响应结果对象，表示"成功"，且封装客户端期望响应的数据
     *
     * @param data 客户端期望响应的数据     * @return 响应结果对象
     */
    public static <T> JsonResult<T> ok(List data) {
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setCode(ServiceCode.OK.getCode());
        jsonResult.setMessage(ServiceCode.OK.getMessage());
        jsonResult.setData(data);
        jsonResult.setTotal(data.size());

        return jsonResult;
    }

    /**
     * 创建响应结果对象，表示"失败"，且封装"失败"的描述
     *
     * @param e            "失败"时抛出的异常对象
     * @return 响应结果对象
     */
    public static JsonResult<Void> failed(ServiceCode serviceCode, Throwable e) {
        return failed(serviceCode,e.getMessage());
    }

    /**
     * 创建响应结果对象，表示"失败"，且封装"失败"的描述
     *
     * @param message      "失败"的描述文本
     * @return 响应结果对象
     */
    public static JsonResult<Void> failed(ServiceCode serviceCode, String message) {
        JsonResult<Void> jsonResult = new JsonResult<Void>();
        jsonResult.setCode(serviceCode.getCode());
        jsonResult.setMessage(message);
        return jsonResult;
    }

}
